package com.pet_service.upload;

import io.minio.PutObjectArgs;
import io.minio.RemoveObjectArgs;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;

/**
 * @author 邹全伸
 * @version 1.0
 * @date 2025-10-05 15:36
 */
public class ImageUploadUtil {
    /**
     * 上传图片
     * @param dirName 目录名称
     * @param file 图片文件
     * @return 图片访问URL
     */
    public static String upload(String dirName, MultipartFile file) {
        if (!MinIOUtil.isValidImage(file)) {
            throw new RuntimeException("文件不是有效的图片格式");
        }
        try {
            // 确保存储桶存在
            MinIOUtil.ensureBucketExists(MinIOUtil.DEFAULT_BUCKET);
            String originalFileName = file.getOriginalFilename();
            String fileName = MinIOUtil.generateUniqueFileName(originalFileName);
            // 构造对象路径：avatars/文件名
            String objectName = dirName + "/" + fileName;
            // 上传文件
            try (InputStream inputStream = file.getInputStream()) {
                MinIOUtil.getMinioClient().putObject(
                        PutObjectArgs.builder()
                                .bucket(MinIOUtil.DEFAULT_BUCKET)
                                .object(objectName)
                                .stream(inputStream, file.getSize(), -1)
                                .contentType(file.getContentType())
                                .build()
                );
            }

            return MinIOUtil.ENDPOINT + "/" + MinIOUtil.DEFAULT_BUCKET + "/" + objectName;
        } catch (Exception e) {
            throw new RuntimeException("上传图片失败: " + e.getMessage(), e);
        }
    }


    /**
     * 从MinIO中删除图片
     * @param dirName 目录名称
     * @param fileName   文件名
     */
    public static void delete(String dirName, String fileName) {
        try {
            // 如果传入的是完整URL，则提取文件名部分
            String actualFileName = fileName;
            if (fileName!=null && fileName.contains("/")) {
                // 从URL中提取文件名
                actualFileName = fileName.substring(fileName.lastIndexOf("/") + 1);
            }
            // 构造对象路径
            String objectName = dirName + "/" + actualFileName;
            // 执行删除操作
            MinIOUtil.getMinioClient().removeObject(RemoveObjectArgs.builder()
                    .bucket(MinIOUtil.DEFAULT_BUCKET)
                    .object(objectName)
                    .build());
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("删除图片失败: " + e.getMessage(), e);
        }
    }
}
